<?php

/**
 * Исключение перезапуска приложения с новыми параметрами.
 *
 */
abstract class Kernel_Filter_Exception_Location extends Kernel_Filter_Exception {

    /**
     * Адрес перенаправления
     *
     * @var string
     */
    private $_url;

    /**
     * Конструктор.
     *
     * @param   string  $message
     * @param   array   $context
     * @param   integer $code
     */
    public function __construct($url, $context = array(), $code = null) {
        parent::__construct(null, $context, $code);
        $this->_url = $this->_absolutize($url);
    }

    /**
     * Возвращает HTTP-заголовки, соответствующие исключению.
     *
     */
    public function getHeaders() {
        return array_merge(parent::getHeaders(), array('Location' => $this->_url));
    }

    /**
     * Возвращает дополнительные параметры исключения.
     *
     * @return  array
     */
    public function getParams() {
        return array_merge(parent::getParams(), array('url' => $this->_url));
    }

    /**
     * Возвращает абсолютный URL от указанного.
     *
     * @param   string  $url
     * @return  string
     */
    private function _absolutize($url) {
        if (is_array($url)) {
            parse_str(Application::getRequest()->query(), $query);
            $query = http_build_query(array_filter(array_merge($query, $url), create_function('$value', 'return null !== $value;')));
            return $_SERVER['SCRIPT_URI'] . (strlen($query) > 0 ? '?' . $query : '');
        } else {
            return parse_url($url, PHP_URL_SCHEME)
                ? $url
                : Application::getResponse()->base() . $url;
        }
    }
}
